;======================================================================
;文件头
NES_16KB_PRG_SIZE           =   1   ;16KB PRG大小数量
NES_8KB_CHR_SIZE            =   0   ;8KB CHR大小数量
BANK_DATA_MASK              =   NES_16KB_PRG_SIZE * 2 - 1     ;bank号掩码
;======================================================================
PRG_DATA_BANK_C000          =   NES_16KB_PRG_SIZE * 2 - 2
PRG_DATA_BANK_E000          =   NES_16KB_PRG_SIZE * 2 - 1
MAPPER_MIRRORING            =   1       ;命名表镜像 0水平 1垂直
;======================================================================
RESET_BANK                  =   NES_16KB_PRG_SIZE * 2 - 1
RESET_ADDR                  =   $E000   ;主程序起始地址
;======================================================================
;======================================================================
    .INESPRG NES_16KB_PRG_SIZE      ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
    .INESCHR NES_8KB_CHR_SIZE       ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
    .INESMAP 4                      ;Mapper号 (0-4095)
    .INESSUBMAP 0                   ;子Mapper号 (0-15)
    .INESMIR 0                      ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
    .INESBAT 0                      ;指定是否存在电池备份 (0: 不存在 1: 存在)
    .INESPRGRAM 0                   ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
    .INESPRGNVRAM 0                 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
    .INESCHRRAM 0                   ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
    .INESCHRNVRAM 0                 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
    .INESTIM 0                      ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
 
    .RSSET $40;内部计数器设置为指定值
FC_Data_L   .RS 1;此符号分配后内部计数器 + 1
FC_Data_H   .RS 1;此符号分配后内部计数器 + 1
FC_Palette  .RS $20;此符号分配后内部计数器 + $20

;======================================================================
    .BANK 0;设置程序所在Bank (限制: 8KB模式 0-7663 16KB模式 3831 32KB模式: 1915)
    .ORG $8200;设置程序编译地址位置
    .BASE $0000;设置程序在中Bank中输出的位置
    
    ;.INCLUDE "sub.asm" ;引用其他源文件
    ;.INCBIN "sub.bin",$10,$40 ;引用其他文件, 从$10开始, 共$20字节
    .STR "FlameCyclone" ;定义一个字符串, 编译结果: 0C 46 6C 61 6D 65 43 79 63 6C 6F 6E 65
    .HEX 4E 45 53 1A ;定义HEX数据, 编译结果: 4E 45 53 1A
    .DW $6502 ;定义双字节数据(小头序), 编译结果: 02 65
    .RDW $6502 ;定义双字节数据(大头序), 编译结果: 65 02
    .DB $65,$02 ;定义双字节数据编译结果: 65 02
    .DS $32;保留32字节数据(用零填充)
    .RDW $6502 ;定义双字节数据(大头序), 编译结果: 65 02
    
;======================================================================
;测试程序
Test_Proc
    LDA #$65
    STA FC_Data_L
    LDA #$02
    STA FC_Data_H
    RTS
    
;======================================================================
    .BANK PRG_DATA_BANK_E000;设置程序所在Bank
    .ORG RESET_ADDR
;不可屏蔽中断处理
Nmi_Program
    PHA
    TXA
    PHA
    TYA
    PHA
    
    LDA $2002
    
    PLA
    TAY
    PLA
    TAX
    PLA

    RTI

;======================================================================
;重启处理
Reset_Program
    SEI
    CLD
    STA $00
    LDA #$00
    STA $2000
    STA $2001
    
    
    LDA #$80
    STA $2000
    LDA #$1E
    STA $2001
    
.Loop
    JMP .Loop

;======================================================================
;请求中断处理
Irq_Program
    RTI

;======================================================================
;中断向量表
    .ORG $FFFA
    .DW Nmi_Program
    .DW Reset_Program
    .DW Irq_Program